package com.zbf.weixinwangyeshouqaun;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.DecoderResult;
import com.google.zxing.qrcode.decoder.Decoder;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

public class QRCodeUtil {
	/** 设定二维码的宽度 **/
	private static int width = 500;
	/**设定二维码的高度**/
	private static int height = 500;
	/**设定二维码的图片格式**/
	private static String format = "png";
	
	/**
	 * 
	 * <h2>由指定链接生成二维码</h2>
	 * <p>根据传入的链接，在指定文件夹内生成指定名称的二维码文件（png格式）。</p>
	 * @param url java.lang.String 要编入二维码的URL
	 * @param dir java.lang.String 存储文件夹名（必须存在）
	 * @param name java.lang.String 给二维码指定文件名
	 */
	public static void createQRCode(String url, String dir, String name) throws IOException {
		//对二维码进行必要的设定
		Map<EncodeHintType, Object> hints = new HashMap<>();
		//设定内容的编码格式
		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
		//设定图像的错误校正程度：
		//M - ~15%
		//L - ~7%
		//H - ~30%
		//Q - ~25%
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
		//设定图像外边距（像素）
		hints.put(EncodeHintType.MARGIN, 2);
		try {
			//进行编码并获得一个bit封装对象
			BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);
			Path file = new File(dir, name + ".png").toPath();
			//使用默认设置、将bit封装对象以指定的图像格式、写入至指定文件中
			MatrixToImageWriter.writeToPath(bitMatrix, format, file);
			//至此，一个二维码图像就生成完毕了，或者也可以使用下面的方法将其写出至输出流中
			//MatrixToImageWriter.writeToStream(matrix, fileName, stream);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * @author: LCG
	 * @date: 2022/3/11
	 * @description:  获取二维码的字节数组
	 */
	public static byte[] createQRCodeByte(String url){
		//对二维码进行必要的设定
		Map<EncodeHintType, Object> hints = new HashMap<>();
		//设定内容的编码格式
		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
		//设定图像的错误校正程度：
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
		//设定图像外边距（像素）
		hints.put(EncodeHintType.MARGIN, 2);
		try {
			//进行编码并获得一个bit封装对象
			BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, width, height, hints);
			DecoderResult decode = new Decoder().decode(bitMatrix);
			return  decode.getRawBytes();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

}